"""
Case Type   : cm_install
Case Name   : cm_install指定-e参数路径错误
Create At   : 2022/11/15
Owner       : @daiguatutu
Description :
    1: 配置xml文件中的cm相关参数;
    2: 数据库用户下执行cm_install,指定-e参数路径错误;
    3: gs_om查看集群状态;
    4: cm_ctl查看集群状态;
    5: 查看数据库用户下进程和定时任务;
Expect      :
    1: 成功
    2: 安装失败
    3: 数据库状态正常,未安装cm
    4: 失败,未安装cm
    5: 无om_monitor、cm_agent、cm_server的进程，无定时任务
History     :
    modified by @ningyali at 2025-4-15:优化用例
"""
import os
import unittest

from testcase.utils.ComInstall import CmInstall
from testcase.utils.Common import Common
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant
from testcase.utils.Logger import Logger
from yat.test import Node
from yat.test import macro


class CMInstallCase(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'-----{os.path.basename(__file__)} start-----')
        self.common = Common()
        self.pri_sh = CommonSH('PrimaryDbUser')
        self.root_nodes = (Node('PrimaryRoot'), Node('Standby1Root'),
                           Node('Standby2Root'))
        self.user_nodes = (Node('PrimaryDbUser'), Node('Standby1DbUser'),
                           Node('Standby2DbUser'))
        self.constant = Constant()
        self.install_pkg_path = os.path.dirname(macro.DB_SCRIPT_PATH)
        self.cm = CmInstall(self.install_pkg_path, self.pri_sh.node.ssh_user)
        env1 = os.path.join(os.path.dirname(macro.DB_ENV_PATH),
                            'error_env')
        env2 = os.path.dirname(macro.DB_ENV_PATH)
        self.env_msg = {
            env1: f"[GAUSS-50201] : The envFile {env1} does not exist",
            env2: f"[GAUSS-50210] : The envFile {env2} must be a file"}

    def test_install(self):
        text = '----step1:配置xml文件中的cm相关参数;expect:执行成功----'
        self.log.info(text)
        res = self.cm.update_xml_for_cm(*self.root_nodes)
        self.assertGreater(res.count('cmDir'), 1, f'执行失败: {text}')

        text = '-----step2:数据库用户下执行cm_install,指定-e参数路径错误 expect:安装失败-----'
        self.log.info(text)
        for env, error_msg in self.env_msg.items():
            ls_cmd = f'cd {self.cm.pkg_path};ls|grep "CM"|grep "tar.gz"'
            self.log.info(ls_cmd)
            ls_res = self.common.get_sh_result(self.user_nodes[0], ls_cmd)
            self.log.info(ls_res)

            param = f"-X {macro.DB_XML_PATH} -e {env} " \
                    f"--cmpkg={os.path.join(self.cm.pkg_path, ls_res.strip())}"
            install_res = self.cm.cm_install(self.user_nodes[0], param)
            self.assertIn(error_msg, install_res, '执行失败:' + text)

        text = '----step3:cm_ctl查看集群状态;expect:失败,未安装cm----'
        self.log.info(text)
        show_status = f'source {macro.DB_ENV_PATH};' \
                      f'cm_ctl query -Civdp'
        status_msg = self.common.get_sh_result(self.user_nodes[0], show_status)
        self.assertIn("cm_ctl: command not found", status_msg, "执行失败:" + text)

        text = '----step4:gs_om查看集群状态;expect:未安装cm----'
        self.log.info(text)
        status_msg = self.pri_sh.get_db_cluster_status('detail')
        self.log.info(status_msg)
        self.assertNotIn('CMServer State', status_msg, "执行失败:" + text)

        text = '----step5:查看数据库用户下进程和定时任务;' \
               'expect:无om_monitor、cm_agent、cm_server的进程，无定时任务----'
        self.log.info(text)
        show_cmd = "crontab -l;ps ux|egrep 'cm_server|cm_agent|om_monitor';"
        process_res = self.pri_sh.exec_gs_ssh(show_cmd)
        self.assertNotIn(process_res, 'bin/cm_server', "执行失败:" + text)
        self.assertNotIn(process_res, 'bin/cm_agent', "执行失败:" + text)
        self.assertNotIn(process_res, 'om_monitor -L', "执行失败:" + text)

    def tearDown(self):
        text = '----poststep1:还原xml;expect:执行成功----'
        self.log.info(text)
        sed_cmd = f'sed -i \'/cm/d\' {self.cm.xml_path};'
        sed_res = self.common.get_sh_result(self.user_nodes[0], sed_cmd)
        self.assertNotIn('error', sed_res.lower(), "执行失败:" + text)
        self.log.info(f'-----{os.path.basename(__file__)} end-----')
